import logging
from logging.handlers import RotatingFileHandler

from flask import Flask
from flask_migrate import Migrate
from flask_session import Session
from flask_sqlalchemy import SQLAlchemy
from redis import StrictRedis

from config import config_dict


# 将数据库操作对象全局化，方便其他文件操作数据库


db = None # type:SQLAlchemy
sr = None # type:StrictRedis


# 配置日志信息（将我们的日志信息写入文件中）
def setup_log(level):
    """配置⽇志"""
    # 设置⽇志的记录等级
    logging.basicConfig(level=level) # 调试debug级
    # 创建⽇志记录器，指明⽇志保存的路径、每个⽇志⽂件的最⼤⼤⼩、保存的⽇志⽂件个数上限
    file_log_handler = RotatingFileHandler("logs/log", maxBytes=1024 * 1024 * 100, backupCount=10)
    # 创建⽇志记录的格式 ⽇志等级 输⼊⽇志信息的⽂件名 ⾏数 ⽇志信息
    # formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s')  # 建议用pathname, 方便查询那一行错误
    formatter = logging.Formatter('%(levelname)s %(pathname)s:%(lineno)d %(message)s')
    # 为刚创建的⽇志记录器设置⽇志记录格式
    file_log_handler.setFormatter(formatter)
    # 为全局的⽇志⼯具对象（flask app使⽤的）添加⽇志记录器
    logging.getLogger().addHandler(file_log_handler)


# 定义一个函数,来封装应用的创建 ,工厂函数,给我物料,给造东西
def create_app(config_type):

    # 根据配置类型取出取出我们的配置类deve ｐｒｏｄｕｃｔ
    config_class = config_dict[config_type]

    # 最为一个服务性的文件,不应该一导入就执行,应该需要是在导入
    app = Flask(__name__)

    #1.1 根据配置来加载应用配置
    app.config.from_object(config_class)

    # 1.2 创建数据库对象
    global db,sr
    db = SQLAlchemy(app)

    # 1.3创建redis 链接对象
    sr = StrictRedis(host=config_class.REDIS_HOST,port=config_class.REDIS_PORT,decode_responses=True)

    # 1.4 创建session 对象
    Session(app)

    # 1.6 创建迁移对象，初始化迁移器
    Migrate(app, db)

    # 共四部，第三部－注册,蓝图
    from info.modules.home import home_blu
    app.register_blueprint(home_blu)

    from info.modules.passport import passport_blu
    app.register_blueprint(passport_blu)

    from info.modules.news import news_blu
    app.register_blueprint(news_blu)





    # 配置我们的日志文件
    setup_log(config_class.LOGLEVEL)

    # 让模型文件和主程序建立关系
    # from Flask06_1.info.models import * 　　# 这种语法错误，不能在局域中使用，不能在函数内使用
    from info import models


    from info.common import index_convert
    # 添加自定义过滤器 ,在哪里使用在哪里导入，避免循环导入问题
    app.add_template_filter(index_convert,'index_convert')
    return app